# -*- coding: utf-8 -*-
# @File    : py_curl.py
# @Author  : Xiewh
# @Email   : 1679860867@qq.com
# @Time    : 2020/11/28 18:13
# @Function:

import pycurl
import json
import io


def init_curl():
    """
    初始化一个pycurl对象，
    尽管urllib2也支持 cookie 但是在登录cas系统时总是失败，并且没有搞清楚失败的原因。
    这里采用pycurl主要是因为pycurl设置了cookie后，可以正常登录Cas系统
    """
    curl = pycurl.Curl()
    curl.setopt(pycurl.SSL_VERIFYHOST, False)  # 对于某些采用HTTPS的网站，有时会因为证书验证失败而无法正常访问，pycurl模块提供了取消验证过程的功能。
    curl.setopt(pycurl.SSL_VERIFYPEER, False)
    # curl.setopt(pycurl.COOKIEFILE, "cookie_file_name")#把cookie保存在该文件中
    # curl.setopt(pycurl.COOKIEJAR, "cookie_file_name")
    curl.setopt(pycurl.FOLLOWLOCATION, 1)  # 允许跟踪来源
    curl.setopt(pycurl.MAXREDIRS, 5)
    # 设置代理 如果有需要请去掉注释，并设置合适的参数
    # curl.setopt(pycurl.PROXY, ‘http://11.11.11.11:8080′)
    # curl.setopt(pycurl.PROXYUSERPWD, ‘aaa:aaa’)
    return curl


def get(curl, url, header=None):
    """
    获得url指定的资源，这里采用了HTTP的GET方法
    """
    if header is None:
        header = ['Accept:*/*']
    try:
        buf = io.BytesIO()
        curl.setopt(pycurl.WRITEFUNCTION, buf.write)
        curl.setopt(pycurl.URL, url)
        curl.setopt(pycurl.HTTPHEADER, header)
        curl.perform()
        the_page = buf.getvalue().decode("utf-8")
        buf.close()
        return the_page
    except Exception as ex:
        return json.dumps({'code': -2, 'msg': "错误：访问资源出错 " + str(ex)})


def post(curl, url, data, header=None):
    """
    提交数据到url，这里使用了HTTP的POST方法
    备注，这里提交的数据为json数据，
    如果需要修改数据类型，请修改head中的数据类型声明
    """
    if header is None:
        header = ['Accept:*/*']
    try:
        buf = io.BytesIO()
        curl.setopt(pycurl.WRITEFUNCTION, buf.write)
        curl.setopt(pycurl.POSTFIELDS, data)
        curl.setopt(pycurl.URL, url)
        curl.setopt(pycurl.HTTPHEADER, header)
        curl.perform()
        the_page = buf.getvalue().decode("utf-8")
        # print the_page
        buf.close()
        return the_page
    except Exception as ex:
        return json.dumps({'code': -2, 'msg': "错误：访问资源出错 " + str(ex)})